package com.cloud.async.result.core;

import com.cloud.async.result.core.body.ResultBody;

import java.util.function.Function;

/**
 * @author chengrui
 * @title: AbstractAsyncFactory
 * @projectName webCloudAsync
 * @description: 结果
 * @date 2025/07/26 23:07
 */
public interface AsyncResult {

    /**
     * 获取结果
     *
     * @param taskId       任务ID
     * @param responseType 结果类型
     * @return <T>
     */
    public <T> ResultBody<T> getResult(String taskId, Class<T> responseType);


    /**
     * 返回结果类型进行转换
     *
     * @param taskId
     * @param responseType 结果类型
     * @param converter       responseType类型T转R
     * @param <T>          参数结果类型
     * @param <R>          参数结果类型函数转结果类型R
     * @return
     */
    public <T, R> ResultBody<R> getResult(String taskId, Class<T> responseType, Function<T, R> converter);


    /**
     * 获取结果,自定义超时时间
     *
     * @param taskId
     * @param milliSecond  为null则使用默认的系统配置时间
     * @param responseType 结果类型
     * @return responseType<T>
     */
    public <T> ResultBody<T> getResult(String taskId, Long milliSecond, Class<T> responseType);


    /**
     * 返回结果类型进行转换
     *
     * @param taskId
     * @param milliSecond  为null则使用默认的系统配置时间
     * @param responseType 结果类型
     * @param converter       responseType类型T转R
     * @param <T>          参数结果类型
     * @param <R>          参数结果类型函数转结果类型R
     * @return
     */
    public <T, R> ResultBody<R> getResult(String taskId, Long milliSecond, Class<T> responseType, Function<T, R> converter);


}
